setTimeout(() => {
    console.log('a');
}, 0);
setImmediate(() => {
    console.log('b');
})

setTimeout(() => {
    setImmediate(() => {
        console.log('c');
    });
    setTimeout(() => {
        console.log('d');
    }, 0);
}, 0);

/* setTimeout(() => {
    console.log('a');
}, 0);
setImmediate(() => {
    console.log('b');
})

setTimeout(() => {
    setImmediate(() => {
        console.log('b');
    });
    setTimeout(() => {
        console.log('a');
    }, 0);
}, 0); */
//setTimeout和setInterval属于同级关系，回调都在timers phase执行。setImmediate属于check phase，由于check阶段在timers phase后面，所以一般情况下setTimeout和setInterval会在setImmediate之前执行。但如果setTimeout的第二个参数写为0情况特殊，setTimeout和setImmediate执行先后顺序不固定。

//bacd固定的打印。
// 把timeout延迟写成100，则bcad